package com.ifly.service;


import com.ifly.exception.BizException;
import com.ifly.model.Order;
import com.ifly.model.OrderStatus;

/**
 * 订单服务（企业规范：所有方法必须记录日志和抛BizException）
 */
public class OrderService {
    private static final String LOG_PREFIX = "[OrderService]";

    /**
     * 更新订单状态（企业规范：必须校验状态流转逻辑）
     * @param order 订单对象
     * @param newStatus 目标状态
     * @throws BizException 如果状态流转非法抛出 INVALID_STATUS_TRANSITION
     */
    public void updateOrderStatus(Order order, OrderStatus newStatus) throws BizException {
        System.out.println(LOG_PREFIX + " 尝试更新订单状态: " + order.getOrderId());

        // 企业规范：状态流转校验
        if (order.getStatus() == OrderStatus.CANCELLED) {
            throw BizException.of(
                    "INVALID_STATUS_TRANSITION",
                    "已取消的订单不允许修改状态"
            );
        }

        if (newStatus == OrderStatus.PAID && order.getStatus() != OrderStatus.CREATED) {
            throw BizException.of(
                    "INVALID_STATUS_TRANSITION",
                    "只有已创建的订单可以支付"
            );
        }

        order.setStatus(newStatus);
        System.out.println(LOG_PREFIX + " 状态更新成功: " + newStatus);
    }

    /**
     * 计算折扣（企业规范：使用BigDecimal避免精度问题）
     * @param order 订单对象
     * @return 折扣率（0.8表示8折）
     */
    public double calculateDiscount(Order order) {
        // 企业规范：金额判断必须用常量
        final double DISCOUNT_THRESHOLD = 100.0;
        final double DISCOUNT_RATE = 0.9;

        return order.getAmount() > DISCOUNT_THRESHOLD ? DISCOUNT_RATE : 1.0;
    }
}